今天會介紹本系列文最後一個陳述式,但陳述式並非只有這幾種。
有了例外狀況處理陳述式,使我們可以避免程式在出現問題時直接掛掉,或者當資料不如預期時,如昨天的非數字強轉數字等等。
例外狀況處理陳述式基本由這三個關鍵字 try catch finally 組成,分別敘述這三個的用途與使用時機。
程式碼在 try 的區塊內,如果執行時有出現任何錯誤不會使程式掛掉,而是在錯誤的句子跳躍,並把錯誤資訊丟給 catch,如果有 catch 的話。
try {
// something...
}
因為你會用到的方法,在處理錯誤時都會 throw 所以才會到 catch 區塊內。
catch 不能單獨寫,需要有 try 才可以使用,用途是接收錯誤資訊,並針對錯誤進行處理,如
catch (Exception ex) {
// somthing...
}
Exception 是所有錯誤的基類,所以可以用 Exception 接所有的錯誤,但你也可以針對各種錯誤做出相對應的處理如
catch (DivideByZeroException divideByZeroEx) {
// 處理除 0 事件
}
catch (IndexOutOfRangeException indexOfRangeEx) {
// 處理索引超出範圍事件
}
catch (Exception ex) {
// 處理不在上述的事件
}
可以應對不同的事件做出不同的處理,講講例外類別幾個我常用的屬性
Message 取得描述目前例外狀況的訊息。
Source 取得或設定造成錯誤的應用程式或物件的名稱。
StackTrace 取得呼叫堆疊上即時運算框架的字串表示。
想要看更多的例外類別,或者實作一個自己的例外類別,都可以在文末參考連結看。
try 與 catch 結束時都會進來 finally 區塊內,處理之後的行為,比較常見的如資料庫連線開啟後,如果發生錯誤事件可能會沒有正確關閉連線,所以連線關閉的方法往往會寫在 finally,無論成功失敗都會進來 finally 來關閉資料庫連線。
與 catch 一樣,需要有 try 才能使用。
知道這三個關鍵字後,我們可以依照上述的需求來排列成,try-catch, try-finally, try-catch-finally 這三種例外處理陳述式,知道每一個關鍵字的含意後,就能知道什麼情況該用哪一種方式來處理例外狀況了。
要有 throw 才能使例外處理陳述式運作,如果沒有人拋錯的話,catch 就不會接到任何東西,如果有看原始碼的話,會發現每一個方法在撰寫時都會預先處理例外狀況。
我們也可以自己寫一個方法來丟 throw,throw 丟出去的東西當然就是我們的例外類別如
static void Main (string[] args) {
try {
TestThrow ();
} catch (Exception ex) {
Console.WriteLine ($"ex.Message : {ex.Message}");
Console.WriteLine ($"ex.Source : {ex.Source}");
Console.WriteLine ($"ex.StackTrace : {ex.StackTrace}");
} finally {
Console.ReadKey ();
}
}
static void TestThrow () {
throw new Exception ("QQ");
}
可以看到一個只貼錯誤的方法,執行這個方法後變會把例外類別給 catch 使用,catch 則印出例外類別的一些屬性,finally 則執行按下任意鍵的方法。
throw 不是只能丟基底類別,所有的例外類別都能丟,但為了易懂所以會丟符合的例外類別。
切記 throw 丟出時外層一定要有 catch 接,否則程式是會掛掉的,因為你的例外沒有被解決。
介紹了例外狀況處理陳述式,也順便介紹一下 VSCode 的除錯方法
我們可以在畫面左邊點擊左鍵增加中斷點,或者按下 F9 在目前行增加中斷點。
有了中斷點後,我們便可以開始基本的除錯了,跟著上面步驟增加中斷點後,程式便會在相對應的位置停下,我們可以觀察到
A 等同於 F5 :使程式繼續執行。
B 等同於 F10:逐步進行若碰到函式則不進入函式可繼續逐步執行。
C 等同於 F11:逐步進行若碰到函式則進入函式並可繼續逐步進行。
D 等同於 Shift + F11:跳出目前函式並可繼續逐步進行。
E 等同於 Ctrl + Shift + F5:重新啟動程式。
F 等同於 Shift + F5:關閉程式。
為什麼中斷點很重要呢?因為程式在執行過程中,我們可以藉由暫停程式運作,並觀察每一個變數所帶有的值,這使我們方便確認執行過程中,每一步都與自己預想的一樣。
今天介紹了如何排除錯誤以及找出錯誤的方式,也就是我們基本的 debug 技巧,這對撰寫程式有很大的幫助,至於 debug 的速度就取決於經驗與本身的其他技巧了。
感謝閱讀。
參考連結
例外狀況處理陳述式 (C# 參考) | Microsoft Docs
C# 各類常見Exception 異常信息 - 掃文資訊
Exception Class (System) | Microsoft Docs
[C#] 自訂例外處理 (Exception) | .NET 隨筆 - 點部落